聚焦於資料集中最具臨床指標性的急性眼部警訊 —— 視力模糊,分析出現模糊症狀的受試者(155 人,31.0%)在「年齡」、「螢幕時長」、「每週頭痛頻率」及「綜合用眼疲勞風險等級(Digital_Eye_Strain_Risk)」上的特徵輪廓與危險暴露型態。
一、實作前情境:眼睛乾澀可以忍,視力模糊是身體拉警報!
在先前的分析中,我們探討了「主觀評分」的乾澀與眼痛(0~10分)。但主觀分數容易受到個人耐受度影響,而 Blurred_Vision則是一個明確的二元客觀症狀(Yes/No):
二、撰寫視力模糊受試者特徵剖析腳本
在Colab中新增儲存格,使用 warnings.filterwarnings('ignore') 確保輸出乾淨,並建立多維度對比圖表與統計表格:
# ==========================================
# Day 14:視力模糊 (Blurred_Vision) 特徵輪廓分析
# ==========================================
import warnings
warnings.filterwarnings('ignore') # 保持終端輸出乾淨
import matplotlib.pyplot as plt
import seaborn as sns
import matplotlib.font_manager as fm
import pandas as pd
# 1. 確保引用中文字型
font_path = 'NotoSansTC-Regular.otf'
my_font = fm.FontProperties(fname=font_path)
# 2. 建立 1x2 畫布佈局
fig, axes = plt.subplots(1, 2, figsize=(16, 6))
sns.set_theme(style="whitegrid")
# 調色盤設定:未模糊 (No) 使用淺冷灰,出現模糊 (Yes) 使用警示橘紅
blur_palette = {'No': '#95a5a6', 'Yes': '#e67e22'}
blur_order = ['No', 'Yes']
# --- 圖 1:視力模糊 vs. 伴隨症狀 (每週頭痛頻率) 分組箱形圖 ---
sns.boxplot(
data=df,
x='Blurred_Vision',
y='Headache_Frequency_Per_Week',
hue='Blurred_Vision',
order=blur_order,
palette=blur_palette,
legend=False,
width=0.45,
boxprops=dict(alpha=0.8),
ax=axes[0]
)
axes[0].set_title('視力模糊 vs. 每週頭痛頻率分佈', fontproperties=my_font, fontsize=14, fontweight='bold')
axes[0].set_xlabel('是否出現視力模糊 (Blurred_Vision)', fontproperties=my_font, fontsize=12)
axes[0].set_ylabel('每週頭痛次數(次/週)', fontproperties=my_font, fontsize=12)
axes[0].set_xticks([0, 1])
axes[0].set_xticklabels(['未出現 (No)', '出現模糊 (Yes)'], fontproperties=my_font, fontsize=11)
# --- 圖 2:視力模糊族群的疲勞風險等級 (Digital_Eye_Strain_Risk) 佔比 ---
risk_order = ['Low', 'Medium', 'High']
risk_crosstab_blur = pd.crosstab(
df['Blurred_Vision'],
df['Digital_Eye_Strain_Risk'],
normalize='index'
)[risk_order] * 100
risk_colors = ['#5dade2', '#f4d03f', '#e74c3c'] # 低風險藍、中風險黃、高風險紅
risk_crosstab_blur.plot(
kind='bar',
stacked=True,
color=risk_colors,
ax=axes[1],
width=0.45,
edgecolor='white'
)
axes[1].set_title('視力模糊狀態 vs. 用眼疲勞風險分級佔比', fontproperties=my_font, fontsize=14, fontweight='bold')
axes[1].set_xlabel('是否出現視力模糊 (Blurred_Vision)', fontproperties=my_font, fontsize=12)
axes[1].set_ylabel('族群內佔比百分比 (%)', fontproperties=my_font, fontsize=12)
axes[1].set_xticks([0, 1])
axes[1].set_xticklabels(['未出現 (No)', '出現模糊 (Yes)'], fontproperties=my_font, rotation=0, fontsize=11)
axes[1].set_ylim(0, 100)
# 設定右圖圖例字型
legend_1 = axes[1].legend(
title='疲勞風險等級',
labels=['低度風險 (Low)', '中度風險 (Medium)', '高度風險 (High)'],
loc='upper right'
)
plt.setp(legend_1.get_texts(), fontproperties=my_font)
plt.setp(legend_1.get_title(), fontproperties=my_font)
plt.tight_layout()
plt.show()
# 3. 輸出兩組受試者在各項核心生理與生活指標上的平均值對照表
print("=== 視力模糊組 (Yes) vs. 正常組 (No) 核心指標詳細對比 ===")
blur_comparison = df.groupby('Blurred_Vision').agg(
受試人數=('Age', 'count'),
平均年齡=('Age', 'mean'),
平均每日螢幕時數=('Daily_Screen_Hours', 'mean'),
平均每日睡眠時數=('Sleep_Hours', 'mean'),
平均每小時休息次數=('Break_Frequency_Per_Hour', 'mean'),
平均每週頭痛次數=('Headache_Frequency_Per_Week', 'mean'),
平均乾澀評分=('Eye_Dryness_Level', 'mean'),
平均眼痛評分=('Eye_Pain_Level', 'mean')
).reset_index()
display(blur_comparison.round(2))
print("\n=== 視力模糊狀態與風險等級交叉百分比表 (%) ===")
display(risk_crosstab_blur.round(1))


三、圖表解讀與客觀數據分析
結合分組箱形圖、風險堆疊長條圖與指標均值對照表,可得出具備高度醫學與數據價值的核心洞察:
1.綜合疲勞風險等級(Risk Level):視力模糊是跨入「高風險」的關鍵分水嶺
(a)交叉百分比數據:
(b)深度洞察:
2.自覺症狀分佈:眼痛顯著加劇,乾澀反呈微幅分流
(a)眼痛程度(Eye_Pain_Level):
(b)乾澀程度(Eye_Dryness_Level):
3.每週頭痛頻率與日常暴露基線:指標高度重疊與臨床反思
(a)每週頭痛次數(Headache_Frequency_Per_Week):
(b)暴露與作息基線:
這段分析明確將 Blurred_Vision 定位為綜合風險的核心預警因子,為單變數與雙變數的探索畫下了極為紮實的句點!